{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-title"
    ]
   },
   "source": [
    "# Convolutional Networks\n",
    "\n",
    "So far we have worked with deep fully-connected networks, using them to explore different optimization strategies and network architectures. Fully-connected networks are a good testbed for experimentation because they are very computationally efficient, but in practice all state-of-the-art results use convolutional networks instead.\n",
    "\n",
    "First you will implement several layer types that are used in convolutional networks. You will then use these layers to train a convolutional network on the CIFAR-10 dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [],
   "source": [
    "# As usual, a bit of setup\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from cs231n.classifiers.cnn import *\n",
    "from cs231n.data_utils import get_CIFAR10_data\n",
    "from cs231n.gradient_check import eval_numerical_gradient_array, eval_numerical_gradient\n",
    "from cs231n.layers import *\n",
    "from cs231n.fast_layers import *\n",
    "from cs231n.solver import Solver\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "\n",
    "# for auto-reloading external modules\n",
    "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "  \"\"\" returns relative error \"\"\"\n",
    "  return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (49000, 3, 32, 32)\n",
      "y_train:  (49000,)\n",
      "X_val:  (1000, 3, 32, 32)\n",
      "y_val:  (1000,)\n",
      "X_test:  (1000, 3, 32, 32)\n",
      "y_test:  (1000,)\n"
     ]
    }
   ],
   "source": [
    "# Load the (preprocessed) CIFAR10 data.\n",
    "\n",
    "data = get_CIFAR10_data()\n",
    "for k, v in data.items():\n",
    "  print('%s: ' % k, v.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive forward pass\n",
    "The core of a convolutional network is the convolution operation. In the file `cs231n/layers.py`, implement the forward pass for the convolution layer in the function `conv_forward_naive`. \n",
    "\n",
    "You don't have to worry too much about efficiency at this point; just write the code in whatever way you find most clear.\n",
    "\n",
    "You can test your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_naive\n",
      "difference:  2.212147649671884e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "w_shape = (3, 3, 4, 4)\n",
    "x = np.linspace(-0.1, 0.5, num=np.prod(x_shape)).reshape(x_shape)\n",
    "w = np.linspace(-0.2, 0.3, num=np.prod(w_shape)).reshape(w_shape)\n",
    "b = np.linspace(-0.1, 0.2, num=3)\n",
    "\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "out, _ = conv_forward_naive(x, w, b, conv_param)\n",
    "correct_out = np.array([[[[-0.08759809, -0.10987781],\n",
    "                           [-0.18387192, -0.2109216 ]],\n",
    "                          [[ 0.21027089,  0.21661097],\n",
    "                           [ 0.22847626,  0.23004637]],\n",
    "                          [[ 0.50813986,  0.54309974],\n",
    "                           [ 0.64082444,  0.67101435]]],\n",
    "                         [[[-0.98053589, -1.03143541],\n",
    "                           [-1.19128892, -1.24695841]],\n",
    "                          [[ 0.69108355,  0.66880383],\n",
    "                           [ 0.59480972,  0.56776003]],\n",
    "                          [[ 2.36270298,  2.36904306],\n",
    "                           [ 2.38090835,  2.38247847]]]])\n",
    "\n",
    "# Compare your output to ours; difference should be around e-8\n",
    "print('Testing conv_forward_naive')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aside: Image processing via convolutions\n",
    "\n",
    "As fun way to both check your implementation and gain a better understanding of the type of operation that convolutional layers can perform, we will set up an input containing two images and manually set up filters that perform common image processing operations (grayscale conversion and edge detection). The convolution forward pass will apply these operations to each of the input images. We can then visualize the results as a sanity check."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Colab Users Only\n",
    "\n",
    "Please execute the below cell to copy two cat images to the Colab VM."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Colab users only!\n",
    "%mkdir -p cs231n/notebook_images\n",
    "%cd drive/My\\ Drive/$FOLDERNAME/cs231n\n",
    "%cp -r notebook_images/ /content/cs231n/\n",
    "%cd /content/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "pdf-ignore-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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ZbDhgpnrkGDK4XFnlHMOw9OrBDqMwBhqwnDBKKTip2j0AotpraOW3OdrjKLvQKA2+Z/8vl6voxNRMHxJJpOErhS7FmEicyX4rsSHi+kvYaDS9OX27dsRw5/P57z//vsRRkijQZRS8RmkzIC8Xn75Zb71rW9xcnISr/0w+rCDL0zuaTqA4bJmOoyoGUampBCPFEsLIfDo0aMIqaURWCL8BZoTZidCP630KYw19b+kNZdkPYe8BC6S8mS9U2UiZfiyF1IHduqQFaey3NsYw2w2ixneIozTzzxpLq+ioWC/bnomIKDLEk0nr4v/6/acXDkIjrpe03U154tTPJpyvMf44BbOWwKW0XgvamoSFih1151z1A6K8R75aMpkus9qXZOXJat1S+cUPhicv3ihc3zQaJOjtKVpPdpkaNPDPmjDel0zHk1QyoC2KJtxtlhS7R3QqYzR7JBbL36ajdds1h2hWeO7Dr9tzqK1ZVRN6JwnKENejAjVCDsZozJN3W4weMosRykTTU7RuKJDkMtVgT4M/nl87q+XhmZuqvULVpw22JD3z87OovNPmriIJi2WQeoYE81IHH/iEJayETIOqeUuGqPcU8aXQgnpARehI60ehUllWcYLL7zA/v5+TOxq25bFYnEpB0EEjnwmDQlNI46GIZPpmD5qflPm8FH498elD4tASmPvxR93cHDA3t4e0+k01lsSK0meO4WQJGIILvIvxJcw1LjhcUxdFAlh/ukel7EPMXetNZPJBCBGJj148IDVahWFSioIgEtCSykVrcG6rqmqKioCcr9UIfowrT+lVAimit510TNjAcQJDg6UIbAtDeE947CkUA5lLM41hLBNyMhzgq4oxxOyImfZOrTOaLuOwvQlj4PKyYsc73sn0nIVKEqNNQWEDhMcCounjy03WUnddNShZqy3TMlanPeUxYhOZ7hsgqLDO4NzDcYoimAYT0b44Ai6P/SbRU1R9rXlz05OGc322OsgLxQOhVOa8WhMyDKyomBdb6jGU6zNaV1LkVdgcux0zosvfRr9tW+ydhsyrWJvAKV6n0mfitb3U9jOKOitVqgUnfIE7zGoS9aAQw7B0xEEadp/GlGRHnClVIylTp1qaZaofC7FVtOywuLkFX9Kyjglll+czcNIFNHU5fml/69g0CJERNg8ePCAW7dukec5i8WCW7du8eDBgxgeKBE/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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imageio import imread\n",
    "from PIL import Image\n",
    "\n",
    "kitten = imread('cs231n/notebook_images/kitten.jpg')\n",
    "puppy = imread('cs231n/notebook_images/puppy.jpg')\n",
    "# kitten is wide, and puppy is already square\n",
    "d = kitten.shape[1] - kitten.shape[0]\n",
    "kitten_cropped = kitten[:, d//2:-d//2, :]\n",
    "\n",
    "img_size = 200   # Make this smaller if it runs too slow\n",
    "resized_puppy = np.array(Image.fromarray(puppy).resize((img_size, img_size)))\n",
    "resized_kitten = np.array(Image.fromarray(kitten_cropped).resize((img_size, img_size)))\n",
    "x = np.zeros((2, 3, img_size, img_size))\n",
    "x[0, :, :, :] = resized_puppy.transpose((2, 0, 1))\n",
    "x[1, :, :, :] = resized_kitten.transpose((2, 0, 1))\n",
    "\n",
    "# Set up a convolutional weights holding 2 filters, each 3x3\n",
    "w = np.zeros((2, 3, 3, 3))\n",
    "\n",
    "# The first filter converts the image to grayscale.\n",
    "# Set up the red, green, and blue channels of the filter.\n",
    "w[0, 0, :, :] = [[0, 0, 0], [0, 0.3, 0], [0, 0, 0]]\n",
    "w[0, 1, :, :] = [[0, 0, 0], [0, 0.6, 0], [0, 0, 0]]\n",
    "w[0, 2, :, :] = [[0, 0, 0], [0, 0.1, 0], [0, 0, 0]]\n",
    "\n",
    "# Second filter detects horizontal edges in the blue channel.\n",
    "w[1, 2, :, :] = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]\n",
    "\n",
    "# Vector of biases. We don't need any bias for the grayscale\n",
    "# filter, but for the edge detection filter we want to add 128\n",
    "# to each output so that nothing is negative.\n",
    "b = np.array([0, 128])\n",
    "\n",
    "# Compute the result of convolving each input in x with each filter in w,\n",
    "# offsetting by b, and storing the results in out.\n",
    "out, _ = conv_forward_naive(x, w, b, {'stride': 1, 'pad': 1})\n",
    "\n",
    "def imshow_no_ax(img, normalize=True):\n",
    "    \"\"\" Tiny helper to show images as uint8 and remove axis labels \"\"\"\n",
    "    if normalize:\n",
    "        img_max, img_min = np.max(img), np.min(img)\n",
    "        img = 255.0 * (img - img_min) / (img_max - img_min)\n",
    "    plt.imshow(img.astype('uint8'))\n",
    "    plt.gca().axis('off')\n",
    "\n",
    "# Show the original images and the results of the conv operation\n",
    "plt.subplot(2, 3, 1)\n",
    "imshow_no_ax(puppy, normalize=False)\n",
    "plt.title('Original image')\n",
    "plt.subplot(2, 3, 2)\n",
    "imshow_no_ax(out[0, 0])\n",
    "plt.title('Grayscale')\n",
    "plt.subplot(2, 3, 3)\n",
    "imshow_no_ax(out[0, 1])\n",
    "plt.title('Edges')\n",
    "plt.subplot(2, 3, 4)\n",
    "imshow_no_ax(kitten_cropped, normalize=False)\n",
    "plt.subplot(2, 3, 5)\n",
    "imshow_no_ax(out[1, 0])\n",
    "plt.subplot(2, 3, 6)\n",
    "imshow_no_ax(out[1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive backward pass\n",
    "Implement the backward pass for the convolution operation in the function `conv_backward_naive` in the file `cs231n/layers.py`. Again, you don't need to worry too much about computational efficiency.\n",
    "\n",
    "When you are done, run the following to check your backward pass with a numeric gradient check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_backward_naive function\n",
      "dx error:  1.6071292638031027e-09\n",
      "dw error:  4.1726378459736035e-10\n",
      "db error:  1.895542296798382e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(4, 3, 5, 5)\n",
    "w = np.random.randn(2, 3, 3, 3)\n",
    "b = np.random.randn(2,)\n",
    "dout = np.random.randn(4, 2, 5, 5)\n",
    "conv_param = {'stride': 2, 'pad': 3}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_forward_naive(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_forward_naive(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_forward_naive(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "out, cache = conv_forward_naive(x, w, b, conv_param)\n",
    "dx, dw, db = conv_backward_naive(dout, cache)\n",
    "\n",
    "# Your errors should be around e-8 or less.\n",
    "print('Testing conv_backward_naive function')\n",
    "print('dx error: ', rel_error(dx, dx_num))\n",
    "print('dw error: ', rel_error(dw, dw_num))\n",
    "print('db error: ', rel_error(db, db_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive forward\n",
    "Implement the forward pass for the max-pooling operation in the function `max_pool_forward_naive` in the file `cs231n/layers.py`. Again, don't worry too much about computational efficiency.\n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_forward_naive function:\n",
      "difference:  4.1666665157267834e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "x = np.linspace(-0.3, 0.4, num=np.prod(x_shape)).reshape(x_shape)\n",
    "pool_param = {'pool_width': 2, 'pool_height': 2, 'stride': 2}\n",
    "\n",
    "out, _ = max_pool_forward_naive(x, pool_param)\n",
    "\n",
    "correct_out = np.array([[[[-0.26315789, -0.24842105],\n",
    "                          [-0.20421053, -0.18947368]],\n",
    "                         [[-0.14526316, -0.13052632],\n",
    "                          [-0.08631579, -0.07157895]],\n",
    "                         [[-0.02736842, -0.01263158],\n",
    "                          [ 0.03157895,  0.04631579]]],\n",
    "                        [[[ 0.09052632,  0.10526316],\n",
    "                          [ 0.14947368,  0.16421053]],\n",
    "                         [[ 0.20842105,  0.22315789],\n",
    "                          [ 0.26736842,  0.28210526]],\n",
    "                         [[ 0.32631579,  0.34105263],\n",
    "                          [ 0.38526316,  0.4       ]]]])\n",
    "\n",
    "# Compare your output with ours. Difference should be on the order of e-8.\n",
    "print('Testing max_pool_forward_naive function:')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive backward\n",
    "Implement the backward pass for the max-pooling operation in the function `max_pool_backward_naive` in the file `cs231n/layers.py`. You don't need to worry about computational efficiency.\n",
    "\n",
    "Check your implementation with numeric gradient checking by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_backward_naive function:\n",
      "dx error:  3.27562514223145e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(3, 2, 8, 8)\n",
    "dout = np.random.randn(3, 2, 4, 4)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: max_pool_forward_naive(x, pool_param)[0], x, dout)\n",
    "\n",
    "out, cache = max_pool_forward_naive(x, pool_param)\n",
    "dx = max_pool_backward_naive(dout, cache)\n",
    "\n",
    "# Your error should be on the order of e-12\n",
    "print('Testing max_pool_backward_naive function:')\n",
    "print('dx error: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast layers\n",
    "\n",
    "Making convolution and pooling layers fast can be challenging. To spare you the pain, we've provided fast implementations of the forward and backward passes for convolution and pooling layers in the file `cs231n/fast_layers.py`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The fast convolution implementation depends on a Cython extension; to compile it either execute the local development cell (option A) if you are developing locally, or the Colab cell (option B) if you are running this assignment in Colab.\n",
    "\n",
    "---\n",
    "\n",
    "**Very Important, Please Read**. For **both** option A and B, you have to **restart** the notebook after compiling the cython extension. In Colab, please save the notebook `File -> Save`, then click `Runtime -> Restart Runtime -> Yes`. This will restart the kernel which means local variables will be lost. Just re-execute the cells from top to bottom and skip the cell below as you only need to run it once for the compilation step.\n",
    "\n",
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Option A: Local Development\n",
    "\n",
    "Go to the cs231n directory and execute the following in your terminal:\n",
    "\n",
    "```bash\n",
    "python setup.py build_ext --inplace\n",
    "```\n",
    "\n",
    "----\n",
    "\n",
    "But I found out:\n",
    "\n",
    "- **THIS MAY NO WORK ON WINDOWS**, showing `cannot found vcvarsall.bat`check out the following:\n",
    "- **step 1**: install `Cython`\n",
    "  - https://github.com/cython/cython/wiki/InstallingOnWindows\n",
    "- **step 2**: compiling Cython extensions (using `MinGW` or `Visual C++`, latter one is preferred cause some problems may occurs using the former one thought `Visual C++` (or the integration `VS Build tools` instead) is about 4G ... )\n",
    "  - https://github.com/cython/cython/wiki/CythonExtensionsOnWindows\n",
    "  - this may help you choose the compatiable version of `VS Build tools`: https://wiki.python.org/moin/WindowsCompilers\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Option B: Colab\n",
    "\n",
    "Execute the cell below only only **ONCE**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%cd drive/My\\ Drive/$FOLDERNAME/cs231n/\n",
    "!python setup.py build_ext --inplace"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The API for the fast versions of the convolution and pooling layers is exactly the same as the naive versions that you implemented above: the forward pass receives data, weights, and parameters and produces outputs and a cache object; the backward pass recieves upstream derivatives and the cache object and produces gradients with respect to the data and weights.\n",
    "\n",
    "**NOTE:** The fast implementation for pooling will only perform optimally if the pooling regions are non-overlapping and tile the input. If these conditions are not met then the fast pooling implementation will not be much faster than the naive implementation.\n",
    "\n",
    "You can compare the performance of the naive and fast versions of these layers by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_fast:\n",
      "Naive: 0.029650s\n",
      "Fast: 0.035241s\n",
      "Speedup: 0.841357x\n",
      "Difference:  2.3726854897098934e-11\n",
      "\n",
      "Testing conv_backward_fast:\n",
      "Naive: 0.501482s\n",
      "Fast: 0.020170s\n",
      "Speedup: 24.862823x\n",
      "dx difference:  1.3815711704063917e-11\n",
      "dw difference:  1.8991176038507358e-13\n",
      "db difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Rel errors should be around e-9 or less\n",
    "from cs231n.fast_layers import conv_forward_fast, conv_backward_fast\n",
    "from time import time\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 31, 31)\n",
    "w = np.random.randn(25, 3, 3, 3)\n",
    "b = np.random.randn(25,)\n",
    "dout = np.random.randn(100, 25, 16, 16)\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = conv_forward_naive(x, w, b, conv_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = conv_forward_fast(x, w, b, conv_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing conv_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('Difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive, dw_naive, db_naive = conv_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast, dw_fast, db_fast = conv_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting conv_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))\n",
    "print('dw difference: ', rel_error(dw_naive, dw_fast))\n",
    "print('db difference: ', rel_error(db_naive, db_fast))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing pool_forward_fast:\n",
      "Naive: 0.010075s\n",
      "fast: 0.000000s\n",
      "speedup: 1007509.231567x\n",
      "difference:  0.0\n",
      "\n",
      "Testing pool_backward_fast:\n",
      "Naive: 0.432392s\n",
      "fast: 0.007351s\n",
      "speedup: 58.819544x\n",
      "dx difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Relative errors should be close to 0.0\n",
    "from cs231n.fast_layers import max_pool_forward_fast, max_pool_backward_fast\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 32, 32)\n",
    "dout = np.random.randn(100, 3, 16, 16)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = max_pool_forward_naive(x, pool_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = max_pool_forward_fast(x, pool_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing pool_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1 + 1e-8)))    # ADDED BY MYSELF because t2-t1 might be close to zero!\n",
    "print('difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive = max_pool_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast = max_pool_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting pool_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional \"sandwich\" layers\n",
    "Previously we introduced the concept of \"sandwich\" layers that combine multiple operations into commonly used patterns. In the file `cs231n/layer_utils.py` you will find sandwich layers that implement a few commonly used patterns for convolutional networks. Run the cells below to sanity check they're working."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu_pool\n",
      "dx error:  6.514336569263308e-09\n",
      "dw error:  1.490843753539445e-08\n",
      "db error:  2.037390356217257e-09\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_pool_forward, conv_relu_pool_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 16, 16)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "out, cache = conv_relu_pool_forward(x, w, b, conv_param, pool_param)\n",
    "dx, dw, db = conv_relu_pool_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu_pool')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu:\n",
      "dx error:  3.5600610115232832e-09\n",
      "dw error:  2.2497700915729298e-10\n",
      "db error:  1.3087619975802167e-10\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_forward, conv_relu_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 8, 8)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "out, cache = conv_relu_forward(x, w, b, conv_param)\n",
    "dx, dw, db = conv_relu_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_forward(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_forward(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_forward(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu:')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three-layer ConvNet\n",
    "Now that you have implemented all the necessary layers, we can put them together into a simple convolutional network.\n",
    "\n",
    "Open the file `cs231n/classifiers/cnn.py` and complete the implementation of the `ThreeLayerConvNet` class. Remember you can use the fast/sandwich layers (already imported for you) in your implementation. Run the following cells to help you debug:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sanity check loss\n",
    "After you build a new network, one of the first things you should do is sanity check the loss. When we use the softmax loss, we expect the loss for random weights (and no regularization) to be about `log(C)` for `C` classes. When we add regularization the loss should go up slightly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial loss (no regularization):  2.302586071243987\n",
      "Initial loss (with regularization):  2.508255635671795\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet()\n",
    "\n",
    "N = 50\n",
    "X = np.random.randn(N, 3, 32, 32)\n",
    "y = np.random.randint(10, size=N)\n",
    "\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (no regularization): ', loss)\n",
    "\n",
    "model.reg = 0.5\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (with regularization): ', loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gradient check\n",
    "After the loss looks reasonable, use numeric gradient checking to make sure that your backward pass is correct. When you use numeric gradient checking you should use a small amount of artifical data and a small number of neurons at each layer. Note: correct implementations may still have relative errors up to the order of e-2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W1 max relative error: 1.380104e-04\n",
      "W2 max relative error: 1.822723e-02\n",
      "W3 max relative error: 3.064049e-04\n",
      "b1 max relative error: 3.477652e-05\n",
      "b2 max relative error: 2.516375e-03\n",
      "b3 max relative error: 7.945660e-10\n"
     ]
    }
   ],
   "source": [
    "num_inputs = 2\n",
    "input_dim = (3, 16, 16)\n",
    "reg = 0.0\n",
    "num_classes = 10\n",
    "np.random.seed(231)\n",
    "X = np.random.randn(num_inputs, *input_dim)\n",
    "y = np.random.randint(num_classes, size=num_inputs)\n",
    "\n",
    "model = ThreeLayerConvNet(num_filters=3, filter_size=3,\n",
    "                          input_dim=input_dim, hidden_dim=7,\n",
    "                          dtype=np.float64)\n",
    "loss, grads = model.loss(X, y)\n",
    "# Errors should be small, but correct implementations may have\n",
    "# relative errors up to the order of e-2\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(X, y)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s max relative error: %e' % (param_name, rel_error(param_grad_num, grads[param_name])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overfit small data\n",
    "A nice trick is to train your model with just a few training samples. You should be able to overfit small datasets, which will result in very high training accuracy and comparatively low validation accuracy.\n",
    "\n",
    "- It helped me find out that I initialized the `W` of layers with `np.ones(shape)` which is not correct !!!\n",
    "  - the phenomena is that I can never overfit a small dataset\n",
    "  - then I try to look it up on the Internet, spot that someone use `np.random.randn(shape)` to initialize\n",
    "  - which is used in the `fc_net.py` !!!\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 30) loss: 2.414060\n",
      "(Epoch 0 / 15) train acc: 0.200000; val_acc: 0.137000\n",
      "(Iteration 2 / 30) loss: 3.102925\n",
      "(Epoch 1 / 15) train acc: 0.140000; val_acc: 0.087000\n",
      "(Iteration 3 / 30) loss: 2.270330\n",
      "(Iteration 4 / 30) loss: 2.096705\n",
      "(Epoch 2 / 15) train acc: 0.240000; val_acc: 0.094000\n",
      "(Iteration 5 / 30) loss: 1.838880\n",
      "(Iteration 6 / 30) loss: 1.934188\n",
      "(Epoch 3 / 15) train acc: 0.510000; val_acc: 0.173000\n",
      "(Iteration 7 / 30) loss: 1.827912\n",
      "(Iteration 8 / 30) loss: 1.639574\n",
      "(Epoch 4 / 15) train acc: 0.520000; val_acc: 0.188000\n",
      "(Iteration 9 / 30) loss: 1.330082\n",
      "(Iteration 10 / 30) loss: 1.756115\n",
      "(Epoch 5 / 15) train acc: 0.630000; val_acc: 0.167000\n",
      "(Iteration 11 / 30) loss: 1.024162\n",
      "(Iteration 12 / 30) loss: 1.041826\n",
      "(Epoch 6 / 15) train acc: 0.750000; val_acc: 0.229000\n",
      "(Iteration 13 / 30) loss: 1.142777\n",
      "(Iteration 14 / 30) loss: 0.835706\n",
      "(Epoch 7 / 15) train acc: 0.790000; val_acc: 0.247000\n",
      "(Iteration 15 / 30) loss: 0.587786\n",
      "(Iteration 16 / 30) loss: 0.645509\n",
      "(Epoch 8 / 15) train acc: 0.820000; val_acc: 0.252000\n",
      "(Iteration 17 / 30) loss: 0.786844\n",
      "(Iteration 18 / 30) loss: 0.467054\n",
      "(Epoch 9 / 15) train acc: 0.820000; val_acc: 0.178000\n",
      "(Iteration 19 / 30) loss: 0.429880\n",
      "(Iteration 20 / 30) loss: 0.635498\n",
      "(Epoch 10 / 15) train acc: 0.900000; val_acc: 0.206000\n",
      "(Iteration 21 / 30) loss: 0.365807\n",
      "(Iteration 22 / 30) loss: 0.284220\n",
      "(Epoch 11 / 15) train acc: 0.820000; val_acc: 0.201000\n",
      "(Iteration 23 / 30) loss: 0.469343\n",
      "(Iteration 24 / 30) loss: 0.509369\n",
      "(Epoch 12 / 15) train acc: 0.920000; val_acc: 0.211000\n",
      "(Iteration 25 / 30) loss: 0.111638\n",
      "(Iteration 26 / 30) loss: 0.145388\n",
      "(Epoch 13 / 15) train acc: 0.930000; val_acc: 0.213000\n",
      "(Iteration 27 / 30) loss: 0.155575\n",
      "(Iteration 28 / 30) loss: 0.143398\n",
      "(Epoch 14 / 15) train acc: 0.960000; val_acc: 0.212000\n",
      "(Iteration 29 / 30) loss: 0.158160\n",
      "(Iteration 30 / 30) loss: 0.118934\n",
      "(Epoch 15 / 15) train acc: 0.990000; val_acc: 0.220000\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "\n",
    "num_train = 100\n",
    "small_data = {\n",
    "  'X_train': data['X_train'][:num_train],\n",
    "  'y_train': data['y_train'][:num_train],\n",
    "  'X_val': data['X_val'],\n",
    "  'y_val': data['y_val'],\n",
    "}\n",
    "\n",
    "\n",
    "model = ThreeLayerConvNet(weight_scale=1e-2)\n",
    "\n",
    "solver = Solver(model, small_data,\n",
    "                num_epochs=15, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=1)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "id": "small_data_train_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Small data training accuracy: 0.82\n"
     ]
    }
   ],
   "source": [
    "# Print final training accuracy\n",
    "print(\n",
    "    \"Small data training accuracy:\",\n",
    "    solver.check_accuracy(small_data['X_train'], small_data['y_train'])\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "id": "small_data_validation_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Small data validation accuracy: 0.252\n"
     ]
    }
   ],
   "source": [
    "# Print final validation accuracy\n",
    "print(\n",
    "    \"Small data validation accuracy:\",\n",
    "    solver.check_accuracy(small_data['X_val'], small_data['y_val'])\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the loss, training accuracy, and validation accuracy should show clear overfitting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(solver.loss_history, 'o')\n",
    "plt.xlabel('iteration')\n",
    "plt.ylabel('loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(solver.train_acc_history, '-o')\n",
    "plt.plot(solver.val_acc_history, '-o')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the net\n",
    "By training the three-layer convolutional network for one epoch, you should achieve greater than 40% accuracy on the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 980) loss: 2.303639\n",
      "(Epoch 0 / 1) train acc: 0.131000; val_acc: 0.130000\n",
      "(Iteration 21 / 980) loss: 2.234715\n",
      "(Iteration 41 / 980) loss: 1.779647\n",
      "(Iteration 61 / 980) loss: 2.441893\n",
      "(Iteration 81 / 980) loss: 1.871315\n",
      "(Iteration 101 / 980) loss: 2.112891\n",
      "(Iteration 121 / 980) loss: 1.497116\n",
      "(Iteration 141 / 980) loss: 1.973969\n",
      "(Iteration 161 / 980) loss: 1.889188\n",
      "(Iteration 181 / 980) loss: 1.822940\n",
      "(Iteration 201 / 980) loss: 1.585304\n",
      "(Iteration 221 / 980) loss: 1.583424\n",
      "(Iteration 241 / 980) loss: 1.693158\n",
      "(Iteration 261 / 980) loss: 1.568496\n",
      "(Iteration 281 / 980) loss: 1.818310\n",
      "(Iteration 301 / 980) loss: 1.658682\n",
      "(Iteration 321 / 980) loss: 1.700839\n",
      "(Iteration 341 / 980) loss: 1.692869\n",
      "(Iteration 361 / 980) loss: 1.750584\n",
      "(Iteration 381 / 980) loss: 1.592076\n",
      "(Iteration 401 / 980) loss: 1.682240\n",
      "(Iteration 421 / 980) loss: 1.710436\n",
      "(Iteration 441 / 980) loss: 1.738240\n",
      "(Iteration 461 / 980) loss: 1.504270\n",
      "(Iteration 481 / 980) loss: 1.703500\n",
      "(Iteration 501 / 980) loss: 1.445929\n",
      "(Iteration 521 / 980) loss: 1.630137\n",
      "(Iteration 541 / 980) loss: 1.575798\n",
      "(Iteration 561 / 980) loss: 1.548048\n",
      "(Iteration 581 / 980) loss: 1.447241\n",
      "(Iteration 601 / 980) loss: 1.677295\n",
      "(Iteration 621 / 980) loss: 1.713346\n",
      "(Iteration 641 / 980) loss: 1.832029\n",
      "(Iteration 661 / 980) loss: 1.420958\n",
      "(Iteration 681 / 980) loss: 1.567638\n",
      "(Iteration 701 / 980) loss: 1.637413\n",
      "(Iteration 721 / 980) loss: 1.446760\n",
      "(Iteration 741 / 980) loss: 1.793795\n",
      "(Iteration 761 / 980) loss: 1.576577\n",
      "(Iteration 781 / 980) loss: 1.458172\n",
      "(Iteration 801 / 980) loss: 1.768848\n",
      "(Iteration 821 / 980) loss: 1.632962\n",
      "(Iteration 841 / 980) loss: 1.288428\n",
      "(Iteration 861 / 980) loss: 1.567725\n",
      "(Iteration 881 / 980) loss: 1.641438\n",
      "(Iteration 901 / 980) loss: 1.715160\n",
      "(Iteration 921 / 980) loss: 1.413262\n",
      "(Iteration 941 / 980) loss: 1.376684\n",
      "(Iteration 961 / 980) loss: 1.277640\n",
      "(Epoch 1 / 1) train acc: 0.473000; val_acc: 0.476000\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet(weight_scale=0.001, hidden_dim=250, reg=0.001)\n",
    "\n",
    "solver = Solver(model, data,\n",
    "                num_epochs=1, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=20)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "id": "full_data_train_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Full data training accuracy: 0.45\n"
     ]
    }
   ],
   "source": [
    "# Print final training accuracy\n",
    "print(\n",
    "    \"Full data training accuracy:\",\n",
    "    solver.check_accuracy(small_data['X_train'], small_data['y_train'])\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "full_data_validation_accuracy"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Full data validation accuracy: 0.476\n"
     ]
    }
   ],
   "source": [
    "# Print final validation accuracy\n",
    "print(\n",
    "    \"Full data validation accuracy:\",\n",
    "    solver.check_accuracy(data['X_val'], data['y_val'])\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Filters\n",
    "You can visualize the first-layer convolutional filters from the trained network by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from cs231n.vis_utils import visualize_grid\n",
    "\n",
    "grid = visualize_grid(model.params['W1'].transpose(0, 2, 3, 1))\n",
    "plt.imshow(grid.astype('uint8'))\n",
    "plt.axis('off')\n",
    "plt.gcf().set_size_inches(5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spatial Batch Normalization\n",
    "We already saw that batch normalization is a very useful technique for training deep fully-connected networks. As proposed in the original paper (link in `BatchNormalization.ipynb`), batch normalization can also be used for convolutional networks, but we need to tweak it a bit; the modification will be called \"spatial batch normalization.\"\n",
    "\n",
    "Normally batch-normalization accepts inputs of shape `(N, D)` and produces outputs of shape `(N, D)`, where we normalize across the minibatch dimension `N`. For data coming from convolutional layers, batch normalization needs to accept inputs of shape `(N, C, H, W)` and produce outputs of shape `(N, C, H, W)` where the `N` dimension gives the minibatch size and the `(H, W)` dimensions give the spatial size of the feature map.\n",
    "\n",
    "If the feature map was produced using convolutions, then we expect every feature channel's statistics e.g. mean, variance to be relatively consistent both between different images, and different locations within the same image -- after all, every feature channel is produced by the same convolutional filter! Therefore spatial batch normalization computes a mean and variance for each of the `C` feature channels by computing statistics over the minibatch dimension `N` as well the spatial dimensions `H` and `W`.\n",
    "\n",
    "\n",
    "[1] [Sergey Ioffe and Christian Szegedy, \"Batch Normalization: Accelerating Deep Network Training by Reducing\n",
    "Internal Covariate Shift\", ICML 2015.](https://arxiv.org/abs/1502.03167)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for spatial batch normalization in the function `spatial_batchnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [9.33463814 8.90909116 9.11056338]\n",
      "  Stds:  [3.61447857 3.19347686 3.5168142 ]\n",
      "After spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [-3.66373598e-16  4.99600361e-17 -8.88178420e-17]\n",
      "  Stds:  [0.99999962 0.99999951 0.9999996 ]\n",
      "After spatial batch normalization (nontrivial gamma, beta):\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [6. 7. 8.]\n",
      "  Stds:  [2.99999885 3.99999804 4.99999798]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "\n",
    "print('Before spatial batch normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', x.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to beta and stds close to gamma\n",
    "gamma, beta = np.asarray([3, 4, 5]), np.asarray([6, 7, 8])\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization (nontrivial gamma, beta):')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After spatial batch normalization (test-time):\n",
      "  means:  [-0.08034398  0.07562874  0.05716365  0.04378379]\n",
      "  stds:  [0.96718652 1.02997042 1.02887526 1.0058548 ]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the test-time forward pass by running the training-time\n",
    "# forward pass many times to warm up the running averages, and then\n",
    "# checking the means and variances of activations after a test-time\n",
    "# forward pass.\n",
    "N, C, H, W = 10, 4, 11, 12\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "gamma = np.ones(C)\n",
    "beta = np.zeros(C)\n",
    "for t in range(50):\n",
    "  x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "  spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "bn_param['mode'] = 'test'\n",
    "x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "a_norm, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "\n",
    "# Means should be close to zero and stds close to one, but will be\n",
    "# noisier than training-time forward passes.\n",
    "print('After spatial batch normalization (test-time):')\n",
    "print('  means: ', a_norm.mean(axis=(0, 2, 3)))\n",
    "print('  stds: ', a_norm.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_batchnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  3.4238386014933895e-07\n",
      "dgamma error:  7.0974817113608705e-12\n",
      "dbeta error:  3.275608725278405e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "fx = lambda x: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fg = lambda a: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fb = lambda b: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "#You should expect errors of magnitudes between 1e-12~1e-06\n",
    "_, cache = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "dx, dgamma, dbeta = spatial_batchnorm_backward(dout, cache)\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Group Normalization\n",
    "In the previous notebook, we mentioned that Layer Normalization is an alternative normalization technique that mitigates the batch size limitations of Batch Normalization. However, as the authors of [2] observed, Layer Normalization does not perform as well as Batch Normalization when used with Convolutional Layers:\n",
    "\n",
    ">With fully connected layers, all the hidden units in a layer tend to make similar contributions to the final prediction, and re-centering and rescaling the summed inputs to a layer works well. However, the assumption of similar contributions is no longer true for convolutional neural networks. The large number of the hidden units whose\n",
    "receptive fields lie near the boundary of the image are rarely turned on and thus have very different\n",
    "statistics from the rest of the hidden units within the same layer.\n",
    "\n",
    "The authors of [3] propose an intermediary technique. In contrast to Layer Normalization, where you normalize over the entire feature per-datapoint, they suggest a consistent splitting of each per-datapoint feature into G groups, and a per-group per-datapoint normalization instead. \n",
    "\n",
    "<p align=\"center\">\n",
    "<img src=\"https://raw.githubusercontent.com/cs231n/cs231n.github.io/master/assets/a2/normalization.png\">\n",
    "</p>\n",
    "<center>Visual comparison of the normalization techniques discussed so far (image edited from [3])</center>\n",
    "\n",
    "Even though an assumption of equal contribution is still being made within each group, the authors hypothesize that this is not as problematic, as innate grouping arises within features for visual recognition. One example they use to illustrate this is that many high-performance handcrafted features in traditional Computer Vision have terms that are explicitly grouped together. Take for example Histogram of Oriented Gradients [4]-- after computing histograms per spatially local block, each per-block histogram is normalized before being concatenated together to form the final feature vector.\n",
    "\n",
    "You will now implement Group Normalization. Note that this normalization technique that you are to implement in the following cells was introduced and published to ECCV just in 2018 -- this truly is still an ongoing and excitingly active field of research!\n",
    "\n",
    "[2] [Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. \"Layer Normalization.\" stat 1050 (2016): 21.](https://arxiv.org/pdf/1607.06450.pdf)\n",
    "\n",
    "\n",
    "[3] [Wu, Yuxin, and Kaiming He. \"Group Normalization.\" arXiv preprint arXiv:1803.08494 (2018).](https://arxiv.org/abs/1803.08494)\n",
    "\n",
    "\n",
    "[4] [N. Dalal and B. Triggs. Histograms of oriented gradients for\n",
    "human detection. In Computer Vision and Pattern Recognition\n",
    "(CVPR), 2005.](https://ieeexplore.ieee.org/abstract/document/1467360/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for group normalization in the function `spatial_groupnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [9.72505327 8.51114185 8.9147544  9.43448077]\n",
      "  Stds:  [3.67070958 3.09892597 4.27043622 3.97521327]\n",
      "After spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [-7.40148683e-18  1.11022302e-17  1.23049719e-16  1.29526020e-17]\n",
      "  Stds:  [0.99999834 0.99999782 0.99999873 0.99999691]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "x_g = x.reshape((N*G,-1))\n",
    "print('Before spatial group normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x_g.mean(axis=1))\n",
    "print('  Stds: ', x_g.std(axis=1))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "# gamma, beta = np.ones((1,C,1,1)), np.zeros((1,C,1,1))   # WHAT ???\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "\n",
    "out, _ = spatial_groupnorm_forward(x, gamma, beta, G, bn_param)\n",
    "out_g = out.reshape((N*G,-1))\n",
    "print('After spatial group normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out_g.mean(axis=1))\n",
    "print('  Stds: ', out_g.std(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_groupnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  5.069505905384412e-08\n",
      "dgamma error:  3.891606265500656e-12\n",
      "dbeta error:  1.3112906756895623e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "# gamma = np.random.randn(1,C,1,1)          # WHAT ???\n",
    "# beta = np.random.randn(1,C,1,1)           # WHAT ???\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "gn_param = {}\n",
    "fx = lambda x: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fg = lambda a: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fb = lambda b: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "_, cache = spatial_groupnorm_forward(x, gamma, beta, G, gn_param)\n",
    "dx, dgamma, dbeta = spatial_groupnorm_backward(dout, cache)\n",
    "#You should expect errors of magnitudes between 1e-12~1e-07\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Edit Metadata",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
